package com.cailu.rabmq.sender.config;

import org.springframework.amqp.core.*;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import com.cailu.common.constant.SenderConfDirectExchangeCommon;

/**
 * @author cailu
 * @filename SenderConfDirectExchangeConfig
 * @description 广播模式 Direct Exchange 路由
 * @date 2020/3/31 18:14
 */
@Configuration
public class SenderConfDirectExchangeConfig {

	/**
	 * Direct Exchange – 处理路由键。
	 * 需要将一个队列绑定到交换机上，要求该消息与一个特定的路由键完全匹配。
	 * 这是一个完整的匹配。如果一个队列绑定到该交换机上要求路由键 “dog”，
	 * 则只有被标记为“dog”的消息才被转发，不会转发dog.puppy，也不会转发dog.guard，只会转发dog。
	 * 适合用于消息的单播发送 ,交换机根据推送消息时的 routing key 和 队列的 routing key 判断消息应该推送到哪个队列
	 */

	@Bean(name = "directQueueA")
	public Queue directQueueA() {
		return QueueBuilder.durable(SenderConfDirectExchangeCommon.DIRECT_QUEUE_A).build();
	}

	/**
	 * 功能描述  创建 DirectExchange 路由键
	 * @return org.springframework.amqp.core.DirectExchange
	 * @author cailu
	 * @date 2020/3/31 21:30
	 */
	@Bean(name = "directExchange")
	public DirectExchange directExchange() {
		// 第一个参数 路由键 第二个参数 持久化  第三个参数 自动删除
		return new DirectExchange(SenderConfDirectExchangeCommon.DIRECT_EXCHANGE, true, false);
	}

	/**
	 * 功能描述 绑定交换机
	 * @param queue          交换机
	 * @param directExchange 路由
	 * @return org.springframework.amqp.core.Binding
	 * @author cailu
	 * @date 2020/3/31 22:48
	 */
	@Bean
	public Binding directBindingA(@Qualifier("directQueueA") Queue queue, DirectExchange directExchange) {
		return BindingBuilder.bind(queue).to(directExchange).with(SenderConfDirectExchangeCommon.DIRECT_QUEUE_A);
	}

}
